# TODO 元组的使用
# 在 Python 中，元组（tuple）是一种不可变的、有序的元素序列。一旦创建，元组中的元素就不能更改。元组和列表非常相似，但元组的功能比列表要少一些，因为它们是不可变的。

# 在使用元组时，有几点需要注意：
# 元组是不可变的。这意味着你不能修改元组中的元素。如果你试图修改元组中的元素，Python 会抛出 TypeError。
# 在创建只包含一个元素的元组时，你需要在元素后面添加一个逗号 ,否则 Python 会将其解析为一个表达式，而不是元组。


# 元组通常用于需要保护不被更改的数据，或者用于“打包”多个值的情况。
# 以下是一些关于 Python 元组的基本用法：
# 创建元组：你可以使用圆括号 () 来创建一个新的元组，元组中的元素用逗号 , 分隔。

tuple = (1, 2, 3, 4, 5, 6)
print(type(tuple))  # <class 'tuple'>
print(tuple)  # (1, 2, 3, 4, 5, 6)

numbers = (1, 2, 3, 4, 5)  # 创建一个包含整数的元组
words = ("hello", "world")  # 创建一个包含字符串的元组
mixed = (1, "two", 3.0, ("four", 5))  # 创建一个包含不同类型元素的元组
singleton = (1,)  # 创建一个只包含一个元素的元组
empty = ()  # 创建一个空元组

# 访问元素：你可以使用索引来访问元组中的元素。索引从 0 开始计数。
numbers = (1, 2, 3, 4, 5)
print(numbers[0])  # 输出：1
print(numbers[3])  # 输出：4

# 你也可以使用负数索引从元组的末尾开始计数。
numbers = (1, 2, 3, 4, 5)
print(numbers[-1])  # 输出：5
print(numbers[-2])  # 输出：4

# 元组长度：你可以使用 len() 函数来获取元组的长度。
numbers = (1, 2, 3, 4, 5)
print(len(numbers))  # 输出：5


# "打包"多个值是指将多个值组合在一起形成一个单一的组合，可以被视为一个整体。在 Python 中，元组常常被用来打包一组相关联的值。这个打包的特性在多个场景下都非常有用。
# 例如，函数可以返回一个元组来一次返回多个值：
def get_name_and_age():
    return ("Alice", 25)


name, age = get_name_and_age()  # 在一行中解包元组并分别赋值给 name 和 age
print(name)  # 输出：Alice
print(age)  # 输出：25

# 在上面的例子中，get_name_and_age() 函数返回了一个包含两个元素的元组。然后，我们在一行中解包了这个元组，并分别将元素赋值给了 name 和 age。这就是元组的打包和解包特性。
# 还有一个例子，当我们需要在列表或者其他数据结构中存储一组有关联的数据时，我们可以使用元组。比如，如果我们有一个列表来存储一些点的坐标，我们可以用元组来表示每一个点的坐标。
# 在这个例子中，我们用元组 (x, y) 来表示点的坐标，然后把这些元组存储在一个列表 points 中。这样我们就能在一次迭代中处理 x 和 y 两个值，这就是元组打包的一个应用。
points = [(1, 2), (3, 4), (5, 6)]
for x, y in points:
    print(f"x={x}, y={y}")
# 上面程序输出如下:
# x=1, y=2
# x=3, y=4
# x=5, y=6
